import pandas as pd
import matplotlib.pyplot as plt
import logging
from datetime import datetime
import os

# 配置日志
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)

# 文件路径配置
INPUT_FILE = 'FhjlViewDD.xlsx'
OUTPUT_IMAGE = 'june_mineral_stats.png'

# 列名配置 - 根据实际Excel列名调整
DATE_COLUMN = '创建时间'
PRODUCT_COLUMN = '货品'
QUANTITY_COLUMN = '净重'
MINERAL_PRODUCT_NAME = '矿粉'

# 设置中文字体
plt.rcParams["font.family"] = ["SimHei", "WenQuanYi Micro Hei", "Heiti TC"]
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题


def analyze_mineral_daily_trend():
    try:
        # 检查输入文件是否存在
        if not os.path.exists(INPUT_FILE):
            logger.error(f"输入文件不存在: {INPUT_FILE}")
            return False

        # 读取Excel文件
        logger.info(f"开始读取Excel文件: {INPUT_FILE}")
        df = pd.read_excel(INPUT_FILE)
        logger.info(f"成功读取文件，共 {len(df)} 行数据")

        # 检查必要列是否存在
        required_columns = [DATE_COLUMN, PRODUCT_COLUMN, QUANTITY_COLUMN]
        missing_columns = [col for col in required_columns if col not in df.columns]
        if missing_columns:
            logger.error(f"Excel文件缺少必要列: {missing_columns}")
            logger.info(f"Excel文件中可用的列: {list(df.columns)}")
            return False

        # 数据清洗和转换
        logger.info("开始数据清洗和转换")

        # 转换日期列
        try:
            df[DATE_COLUMN] = pd.to_datetime(df[DATE_COLUMN])
        except Exception as e:
            logger.error(f"日期转换失败: {str(e)}")
            return False

        # 筛选6月份数据
        df['year'] = df[DATE_COLUMN].dt.year
        df['month'] = df[DATE_COLUMN].dt.month
        june_data = df[(df['year'] == 2025) & (df['month'] == 6)]
        logger.info(f"筛选出2025年6月份数据，共 {len(june_data)} 行")

        if len(june_data) == 0:
            logger.warning("未找到2025年6月份的数据")
            return False

        # 筛选矿粉产品
        mineral_data = june_data[june_data[PRODUCT_COLUMN] == MINERAL_PRODUCT_NAME]
        logger.info(f"筛选出矿粉产品数据，共 {len(mineral_data)} 行")

        if len(mineral_data) == 0:
            logger.warning("未找到矿粉产品的数据")
            return False

        # 按日期汇总货运量
        logger.info("按日期汇总矿粉货运量")
        mineral_data['date'] = mineral_data[DATE_COLUMN].dt.date
        daily_summary = mineral_data.groupby('date')[QUANTITY_COLUMN].sum().reset_index()
        daily_summary.columns = ['日期', '货运量(吨)']

        logger.info(f"汇总完成，共 {len(daily_summary)} 天的数据")

        # 绘制柱状图
        logger.info("开始绘制柱状图")
        plt.figure(figsize=(15, 7))
        bars = plt.bar(daily_summary['日期'].astype(str), daily_summary['货运量(吨)'], color='skyblue')

        # 添加标题和标签
        plt.title('2025年6月矿粉货运量日趋势', fontsize=16)
        plt.xlabel('日期', fontsize=12)
        plt.ylabel('货运量(吨)', fontsize=12)

        # 旋转x轴标签以便更好显示
        plt.xticks(rotation=45, ha='right')

        # 添加数据标签
        for bar in bars:
            height = bar.get_height()
            plt.text(bar.get_x() + bar.get_width()/2., height, f'{height:.1f}', ha='center', va='bottom')

        # 调整布局
        plt.tight_layout()

        # 保存图表
        plt.savefig(OUTPUT_IMAGE, dpi=300)
        logger.info(f"图表已保存至: {OUTPUT_IMAGE}")

        # 显示统计信息
        total_mineral = daily_summary['货运量(吨)'].sum()
        avg_mineral = daily_summary['货运量(吨)'].mean()
        max_mineral = daily_summary['货运量(吨)'].max()
        max_date = daily_summary.loc[daily_summary['货运量(吨)'].idxmax()]['日期']

        logger.info("矿粉货运量统计信息:")
        logger.info(f"6月矿粉总货运量: {total_mineral:.2f}吨")
        logger.info(f"日均矿粉货运量: {avg_mineral:.2f}吨")
        logger.info(f"最大日货运量: {max_mineral:.2f}吨 (日期: {max_date})")

        return True

    except Exception as e:
        logger.error(f"分析过程中发生错误: {str(e)}", exc_info=True)
        return False


if __name__ == "__main__":
    success = analyze_mineral_daily_trend()
    if success:
        logger.info("矿粉日趋势分析完成")
    else:
        logger.error("矿粉日趋势分析失败")